package top.byteio.common.core.crypto;


import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

/**
 * 加密或编码算法接口
 * @author lerryxia
 * @data 2023/6/12 12:06
 */
public interface ICrypt {


    /**
     * 生成随机秘钥 public key 和 private key
     * @param keyBitSize    密钥大小
     * <br>
     * <p><b>对于不同的加密算法，keyBitSize 的推荐值不同：</b></p>
     * <ul>对称加密算法:
     *  <li> AES: 通常为 128、192 或 256 位</li>
     *  <li> DES: 56 位（实际密钥长度）</li>
     *  <li> DESede (3DES): 112 或 168 位</li>
     *  <li> Blowfish: 32 到 448 位之间</li>
     * </ul>
     * <ul> 非对称加密算法:
     *  <li> RSA: 通常为 1024、2048 或 4096 位</li>
     *  <li> DSA: 512 到 1024 位（传统）或更长</li>
     *  <li> EC (椭圆曲线): 通常为 160、192、224、256、384 或 521 位</li>
     * </ul>
     * @param algorithmName 算法名称
     * <br>
     * <B>下面是常见的算法名称：</b>
     * <ul>
     *  <li>消息摘要算法</li>
     * MD5, SHA-1, SHA-256, SHA-384, SHA-512
     *  <li>对称加密算法</li>
     * AES, DES, DESede, Blowfish, RC2, RC4
     *  <li>非对称加密算法</li>
     * RSA, DSA, DiffieHellman, EC
     *  <li>消息认证码算法</li>
     * HmacMD5, HmacSHA1, HmacSHA256
     * </ul>
     * @return java.security.KeyPair 公钥和私钥持有者
     * @throws NoSuchAlgorithmException 当请求特定的加密算法但在环境中不可用时抛出此异常。
     * @since 2023/6 /12 12:36
     */
    static KeyPair generateSymmetryKey(int keyBitSize, String algorithmName) throws NoSuchAlgorithmException {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance(algorithmName);
        keyGen.initialize(keyBitSize, new SecureRandom());
        return keyGen.generateKeyPair();
    }
}

